function Cykl_out = mergeCycles( Cykl1, Cykl2, WeightMatrix, DemandMatrix )
% predpokladame, ze routes jsou v poradi zleva doprava
% a ze edges jsou zadany rovnez ve spranym poradi!!

Cykl_out = Cykl1;

% vlozit jako smycku
index_nodeA = 1;
index_nodeB = length(Cykl2.route);
index_nodeA_second = 0;
index_nodeB_second = 0;

for i=1:length( Cykl2.route )  
    if ( routeContainsNode( Cykl2.edges(:,1)' , Cykl2.route(1, i) ) > 0 )     
        index_nodeA = i;
        break;      
    end 
end

for i=length(Cykl2.route):-1:1 
    if ( routeContainsNode( Cykl2.edges(:,2)' , Cykl2.route(1, i) ) > 0 )     
        index_nodeB = i;
        break;      
    end   
end



%aby smycka sla udelat, je potreba zjistit, zda existuje i druhej bod
% k nodeA nebo nodeB
%nejdriv pro nodeA
for i=length(Cykl2.route):-1:index_nodeA+1
    if ( (Cykl2.route(1, i) == Cykl2.route(1, index_nodeA)) ) 
        
        if ( i >= index_nodeB )        
            index_nodeA_second = i;
            break;      
        end
    end   
end

%pak pro nodeB
for i=index_nodeB-1:length(Cykl2.route)
    if ( (Cykl2.route(1, i) == Cykl2.route(1, index_nodeB)) )     
        
        if ( i <= index_nodeA )
            index_nodeB_second = i;
            break;      
        end
    end   
end


%lze udelat smycka?
if ( index_nodeB_second ~= 0 || index_nodeA_second ~=0 )
    
    index = routeContainsNode( Cykl1.route, Cykl2.route(1, index_nodeA) );
    if ( index == 0 )
        index = routeContainsNode( Cykl1.route, Cykl2.route(1, index_nodeB) );
    end
    
    
    if ( index > 0 )
        
        smyckaA = [];
        smyckaB = [];   
       
        if ( index_nodeA_second > 0 )
           
            v2 = Cykl2.route(1, index_nodeA:index_nodeA_second );
            v1_partI  = Cykl1.route(1, 1:(index-1) );
            v1_partII = Cykl1.route(1, (index+1):end);
            
            smyckaA = [ v1_partI v2 v1_partII ];
                                    
        elseif ( index_nodeB_second > 0 )
            
            v2 = Cykl2.route(1, index_nodeB:index_nodeB_second );
            v1_partI  = Cykl1.route(1, 1:(index-1) );
            v1_partII = Cykl1.route(1, (index+1):end);
            
            smyckaB = [ v1_partI v2 v1_partII ];           
            
        end
        
        
        %pokud vznikly 2 smycky, vyberu tu kratsi
        if ( ~isempty(smyckaA) && ~isempty(smyckaB) )
           
            if ( costOfRoute( smyckaA, WeightMatrix ) > costOfRoute( smyckaB, WeightMatrix ) )
               
                vysledek = smyckaB;
                
            else
                
                vysledek = smyckaA;
                
            end
            
        elseif ( ~isempty(smyckaA) )
            
            vysledek = smyckaA;  
        else
            
            vysledek = smyckaB;     
        end
        
        
        Cykl_out.route = vysledek;
        Cykl_out.edges = [ Cykl1.edges ; Cykl2.edges ];
        Cykl_out.cost = costOfRoute( Cykl_out.route, WeightMatrix );
        Cykl_out.demand = demandOfRoute( Cykl_out.edges, DemandMatrix );
    
    end
end



end

